'use strict';

var _ = require('underscore');

// reference http://www.postgresql.org/docs/9.3/static/errcodes-appendix.html
// Used `^([A-Z0-9]*)\s(.*)` -> `"$1": "$2"` to create the JS object
var codeToCondition = {
// Class 00 — Successful Completion
    '00000': 'successful_completion',
    // Class 01 — Warning
    '01000': 'warning',
    '0100C': 'dynamic_result_sets_returned',
    '01008': 'implicit_zero_bit_padding',
    '01003': 'null_value_eliminated_in_set_function',
    '01007': 'privilege_not_granted',
    '01006': 'privilege_not_revoked',
    '01004': 'string_data_right_truncation',
    '01P01': 'deprecated_feature',
    // Class 02 — No Data (this is also a warning class per the SQL standard)
    '02000': 'no_data',
    '02001': 'no_additional_dynamic_result_sets_returned',
    // Class 03 — SQL Statement Not Yet Complete
    '03000': 'sql_statement_not_yet_complete',
    // Class 08 — Connection Exception
    '08000': 'connection_exception',
    '08003': 'connection_does_not_exist',
    '08006': 'connection_failure',
    '08001': 'sqlclient_unable_to_establish_sqlconnection',
    '08004': 'sqlserver_rejected_establishment_of_sqlconnection',
    '08007': 'transaction_resolution_unknown',
    '08P01': 'protocol_violation',
    // Class 09 — Triggered Action Exception
    '09000': 'triggered_action_exception',
    // Class 0A — Feature Not Supported
    '0A000': 'feature_not_supported',
    // Class 0B — Invalid Transaction Initiation
    '0B000': 'invalid_transaction_initiation',
    // Class 0F — Locator Exception
    '0F000': 'locator_exception',
    '0F001': 'invalid_locator_specification',
    // Class 0L — Invalid Grantor
    '0L000': 'invalid_grantor',
    '0LP01': 'invalid_grant_operation',
    // Class 0P — Invalid Role Specification
    '0P000': 'invalid_role_specification',
    // Class 0Z — Diagnostics Exception
    '0Z000': 'diagnostics_exception',
    '0Z002': 'stacked_diagnostics_accessed_without_active_handler',
    // Class 20 — Case Not Found
    20000: 'case_not_found',
    // Class 21 — Cardinality Violation
    21000: 'cardinality_violation',
    // Class 22 — Data Exception
    22000: 'data_exception',
    '2202E': 'array_subscript_error',
    22021: 'character_not_in_repertoire',
    22008: 'datetime_field_overflow',
    22012: 'division_by_zero',
    22005: 'error_in_assignment',
    '2200B': 'escape_character_conflict',
    22022: 'indicator_overflow',
    22015: 'interval_field_overflow',
    '2201E': 'invalid_argument_for_logarithm',
    22014: 'invalid_argument_for_ntile_function',
    22016: 'invalid_argument_for_nth_value_function',
    '2201F': 'invalid_argument_for_power_function',
    '2201G': 'invalid_argument_for_width_bucket_function',
    22018: 'invalid_character_value_for_cast',
    22007: 'invalid_datetime_format',
    22019: 'invalid_escape_character',
    '2200D': 'invalid_escape_octet',
    22025: 'invalid_escape_sequence',
    '22P06': 'nonstandard_use_of_escape_character',
    22010: 'invalid_indicator_parameter_value',
    22023: 'invalid_parameter_value',
    '2201B': 'invalid_regular_expression',
    '2201W': 'invalid_row_count_in_limit_clause',
    '2201X': 'invalid_row_count_in_result_offset_clause',
    22009: 'invalid_time_zone_displacement_value',
    '2200C': 'invalid_use_of_escape_character',
    '2200G': 'most_specific_type_mismatch',
    22004: 'null_value_not_allowed',
    22002: 'null_value_no_indicator_parameter',
    22003: 'numeric_value_out_of_range',
    22026: 'string_data_length_mismatch',
    22001: 'string_data_right_truncation',
    22011: 'substring_error',
    22027: 'trim_error',
    22024: 'unterminated_c_string',
    '2200F': 'zero_length_character_string',
    '22P01': 'floating_point_exception',
    '22P02': 'invalid_text_representation',
    '22P03': 'invalid_binary_representation',
    '22P04': 'bad_copy_file_format',
    '22P05': 'untranslatable_character',
    '2200L': 'not_an_xml_document',
    '2200M': 'invalid_xml_document',
    '2200N': 'invalid_xml_content',
    '2200S': 'invalid_xml_comment',
    '2200T': 'invalid_xml_processing_instruction',
    // Class 23 — Integrity Constraint Violation
    23000: 'integrity_constraint_violation',
    23001: 'restrict_violation',
    23502: 'not_null_violation',
    23503: 'foreign_key_violation',
    23505: 'unique_violation',
    23514: 'check_violation',
    '23P01': 'exclusion_violation',
    // Class 24 — Invalid Cursor State
    24000: 'invalid_cursor_state',
    // Class 25 — Invalid Transaction State
    25000: 'invalid_transaction_state',
    25001: 'active_sql_transaction',
    25002: 'branch_transaction_already_active',
    25008: 'held_cursor_requires_same_isolation_level',
    25003: 'inappropriate_access_mode_for_branch_transaction',
    25004: 'inappropriate_isolation_level_for_branch_transaction',
    25005: 'no_active_sql_transaction_for_branch_transaction',
    25006: 'read_only_sql_transaction',
    25007: 'schema_and_data_statement_mixing_not_supported',
    '25P01': 'no_active_sql_transaction',
    '25P02': 'in_failed_sql_transaction',
    '25P03': 'idle_in_transaction_session_timeout',
    // Class 26 — Invalid SQL Statement Name
    26000: 'invalid_sql_statement_name',
    // Class 27 — Triggered Data Change Violation
    27000: 'triggered_data_change_violation',
    // Class 28 — Invalid Authorization Specification
    28000: 'invalid_authorization_specification',
    '28P01': 'invalid_password',
    // Class 2B — Dependent Privilege Descriptors Still Exist
    '2B000': 'dependent_privilege_descriptors_still_exist',
    '2BP01': 'dependent_objects_still_exist',
    // Class 2D — Invalid Transaction Termination
    '2D000': 'invalid_transaction_termination',
    // Class 2F — SQL Routine Exception
    '2F000': 'sql_routine_exception',
    '2F005': 'function_executed_no_return_statement',
    '2F002': 'modifying_sql_data_not_permitted',
    '2F003': 'prohibited_sql_statement_attempted',
    '2F004': 'reading_sql_data_not_permitted',
    // Class 34 — Invalid Cursor Name
    34000: 'invalid_cursor_name',
    // Class 38 — External Routine Exception
    38000: 'external_routine_exception',
    38001: 'containing_sql_not_permitted',
    38002: 'modifying_sql_data_not_permitted',
    38003: 'prohibited_sql_statement_attempted',
    38004: 'reading_sql_data_not_permitted',
    // Class 39 — External Routine Invocation Exception
    39000: 'external_routine_invocation_exception',
    39001: 'invalid_sqlstate_returned',
    39004: 'null_value_not_allowed',
    '39P01': 'trigger_protocol_violated',
    '39P02': 'srf_protocol_violated',
    '39P03': 'event_trigger_protocol_violated',
    // Class 3B — Savepoint Exception
    '3B000': 'savepoint_exception',
    '3B001': 'invalid_savepoint_specification',
    // Class 3D — Invalid Catalog Name
    '3D000': 'invalid_catalog_name',
    // Class 3F — Invalid Schema Name
    '3F000': 'invalid_schema_name',
    // Class 40 — Transaction Rollback
    40000: 'transaction_rollback',
    40002: 'transaction_integrity_constraint_violation',
    40001: 'serialization_failure',
    40003: 'statement_completion_unknown',
    '40P01': 'deadlock_detected',
    // Class 42 — Syntax Error or Access Rule Violation
    42000: 'syntax_error_or_access_rule_violation',
    42601: 'syntax_error',
    42501: 'insufficient_privilege',
    42846: 'cannot_coerce',
    42803: 'grouping_error',
    '42P20': 'windowing_error',
    '42P19': 'invalid_recursion',
    42830: 'invalid_foreign_key',
    42602: 'invalid_name',
    42622: 'name_too_long',
    42939: 'reserved_name',
    42804: 'datatype_mismatch',
    '42P18': 'indeterminate_datatype',
    '42P21': 'collation_mismatch',
    '42P22': 'indeterminate_collation',
    42809: 'wrong_object_type',
    '428C9': 'generated_always',
    42703: 'undefined_column',
    42883: 'undefined_function',
    '42P01': 'undefined_table',
    '42P02': 'undefined_parameter',
    42704: 'undefined_object',
    42701: 'duplicate_column',
    '42P03': 'duplicate_cursor',
    '42P04': 'duplicate_database',
    42723: 'duplicate_function',
    '42P05': 'duplicate_prepared_statement',
    '42P06': 'duplicate_schema',
    '42P07': 'duplicate_table',
    42712: 'duplicate_alias',
    42710: 'duplicate_object',
    42702: 'ambiguous_column',
    42725: 'ambiguous_function',
    '42P08': 'ambiguous_parameter',
    '42P09': 'ambiguous_alias',
    '42P10': 'invalid_column_reference',
    42611: 'invalid_column_definition',
    '42P11': 'invalid_cursor_definition',
    '42P12': 'invalid_database_definition',
    '42P13': 'invalid_function_definition',
    '42P14': 'invalid_prepared_statement_definition',
    '42P15': 'invalid_schema_definition',
    '42P16': 'invalid_table_definition',
    '42P17': 'invalid_object_definition',
    // Class 44 — WITH CHECK OPTION Violation
    44000: 'with_check_option_violation',
    // Class 53 — Insufficient Resources
    53000: 'insufficient_resources',
    53100: 'disk_full',
    53200: 'out_of_memory',
    53300: 'too_many_connections',
    53400: 'configuration_limit_exceeded',
    // Class 54 — Program Limit Exceeded
    54000: 'program_limit_exceeded',
    54001: 'statement_too_complex',
    54011: 'too_many_columns',
    54023: 'too_many_arguments',
    // Class 55 — Object Not In Prerequisite State
    55000: 'object_not_in_prerequisite_state',
    55006: 'object_in_use',
    '55P02': 'cant_change_runtime_param',
    '55P03': 'lock_not_available',
    // Class 57 — Operator Intervention
    57000: 'operator_intervention',
    57014: 'query_canceled',
    '57P01': 'admin_shutdown',
    '57P02': 'crash_shutdown',
    '57P03': 'cannot_connect_now',
    '57P04': 'database_dropped',
    // Class 58 — System Error (errors external to PostgreSQL itself)
    58000: 'system_error',
    58030: 'io_error',
    '58P01': 'undefined_file',
    '58P02': 'duplicate_file',
    // Class F0 — Configuration File Error
    F0000: 'config_file_error',
    F0001: 'lock_file_exists',
    // Class HV — Foreign Data Wrapper Error (SQL/MED)
    HV000: 'fdw_error',
    HV005: 'fdw_column_name_not_found',
    HV002: 'fdw_dynamic_parameter_value_needed',
    HV010: 'fdw_function_sequence_error',
    HV021: 'fdw_inconsistent_descriptor_information',
    HV024: 'fdw_invalid_attribute_value',
    HV007: 'fdw_invalid_column_name',
    HV008: 'fdw_invalid_column_number',
    HV004: 'fdw_invalid_data_type',
    HV006: 'fdw_invalid_data_type_descriptors',
    HV091: 'fdw_invalid_descriptor_field_identifier',
    HV00B: 'fdw_invalid_handle',
    HV00C: 'fdw_invalid_option_index',
    HV00D: 'fdw_invalid_option_name',
    HV090: 'fdw_invalid_string_length_or_buffer_length',
    HV00A: 'fdw_invalid_string_format',
    HV009: 'fdw_invalid_use_of_null_pointer',
    HV014: 'fdw_too_many_handles',
    HV001: 'fdw_out_of_memory',
    HV00P: 'fdw_no_schemas',
    HV00J: 'fdw_option_name_not_found',
    HV00K: 'fdw_reply_handle',
    HV00Q: 'fdw_schema_not_found',
    HV00R: 'fdw_table_not_found',
    HV00L: 'fdw_unable_to_create_execution',
    HV00M: 'fdw_unable_to_create_reply',
    HV00N: 'fdw_unable_to_establish_connection',
    // Class P0 — PL/pgSQL Error
    P0000: 'plpgsql_error',
    P0001: 'raise_exception',
    P0002: 'no_data_found',
    P0003: 'too_many_rows',
    P0004: 'assert_failure',
    // Class XX — Internal Error
    XX000: 'internal_error',
    XX001: 'data_corrupted',
    XX002: 'index_corrupted'
};

module.exports.codeToCondition = codeToCondition;
module.exports.conditionToCode = _.invert(codeToCondition);
